1. Summary
1.1 Summary table
A total of 306,021 persons have been reached by EiE activities in
2023, of which 127,370 were boys, 121,766 were girls, 43,725 were men
and 13,160 were women. Below is a summary by indicator.
Summary statistics for EIE 5Ws reporting, 25 June 2023Indicator | Partners1 | Counties | June_reached | Total_reached | Target | %Target_reached |
|---|
1. Access ECD spaces/schools | 11 | 14 | 7,238 | 188,406 | 1,201,151 | 15.69 |
2. Feeding programmes | 9 | 6 | 1,456 | 48,249 | 784,647 | 6.15 |
3. Teaching materials | 9 | 10 | 0 | 146,339 | 600,578 | 24.37 |
4. Safe water, personal hygiene | 6 | 5 | 0 | 27,228 | 784,647 | 3.47 |
5. Educators resilience enhancing | 13 | 12 | 729 | 4,859 | 6,018 | 80.74 |
6. Children resilience enhancing | 11 | 12 | 2,592 | 64,507 | 154,729 | 41.69 |
Total | 32 | 18 | 12,015 | 306,0212 | 2,146,5452 | 14.26 |
1Only implementing partners |
2Only the sum of indicators 1, 2, 5 and 6 |
1.2 By sex and age

Only Indicator 6, Children benefiting from resilience-enhancing
programming, sees a higher proportion of females reached over men.

1.3 By county
39.8% of all beneficiaries reached originate from Turkana, though it
only has 14.05% of the targeted population.

IPC data extracted from here.
2. Progress by indicator
2.1 Overall progress

2.2 Reached by indicator
2.2.1 Access to ECD spaces/schools
EiE Indicator 1, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target_reached |
|---|
1. Access ECD spaces/schools | 11 | 14 | 7,238 | 188,406 | 1,201,151 | 15.69 |

In June 2023, 7,238 persons were reached by interventions
contributing to this indicator, of which 3,486 were boys and 3,220 were
girls.

2.2.2 School feeding programmes
EiE Indicator 2, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target_reached |
|---|
2. Feeding programmes | 9 | 6 | 1,456 | 48,249 | 784,647 | 6.15 |

In June 2023, 1,456 persons were reached by interventions
contributing to this indicator, of which 783 were boys and 673 were
girls.

2.2.3 Teaching and learning materials
EiE Indicator 3, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target_reached |
|---|
3. Teaching materials | 9 | 10 | 0 | 146,339 | 600,578 | 24.37 |

In June 2023, 0 persons were reached by interventions contributing to
this indicator, of which 0 were boys, 0 were girls, 0 were men and 0
were women.

2.2.4 Safe water, personal hygiene
EiE Indicator 4, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target_reached |
|---|
4. Safe water, personal hygiene | 6 | 5 | 0 | 27,228 | 784,647 | 3.47 |

In June 2023, 0 persons were reached by interventions contributing to
this indicator, of which 0 were boys and 0 and were girls.

2.2.5 Educators trained in resilience enhancing programmes
EiE Indicator 5, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target_reached |
|---|
5. Educators resilience enhancing | 13 | 12 | 729 | 4,859 | 6,018 | 80.74 |

In June 2023, 729 persons were reached by interventions contributing
to this indicator, of which 474 were men and 255 and were women.

2.2.6 Children benefited from resilience enhancing programmes
EiE Indicator 6, as of 25 June 2023Indicator | Partners | Counties | June_reached | Total_reached | Target | %Target_reached |
|---|
6. Children resilience enhancing | 11 | 12 | 2,592 | 64,507 | 154,729 | 41.69 |

In June 2023, 2,592 persons were reached by interventions
contributing to this indicator, of which 1,330 were boys and 1,262 and
were girls

3. Partners
3.1 Operational presence of implementing partners
Below is an interactive table which adds detail to the map above,
serving additional information for coordination – allowing interested
parties to search by county or partner.
The column #Activities refers to the number of Education
activities implemented by said partner in each county. Each column can
be sorted with the arrows next to each column name. Each column can also
be filtered by typing into the search bar below each column name. Only
completed activities have been included.
Download the dataset from the table below here.
3.2 Summary by implementing partner
The table below breaks down persons reached by partner.
Summary by implementing partnerimplementing_partner | reached1 | counties | activities | %total2 |
|---|
Finn Church Aid | 187,433 | 5 | 6 | 39.08 |
Homa Bay County | 57,020 | 1 | 1 | 11.89 |
Norwegian Refugee Council | 52,914 | 2 | 3 | 11.03 |
World Vision Kenya | 32,353 | 6 | 6 | 6.75 |
Women Educational Researchers of Kenya | 23,122 | 5 | 2 | 4.82 |
We World | 20,947 | 2 | 1 | 4.37 |
Lifeskills Promoters | 19,199 | 2 | 3 | 4.00 |
Save the Children | 19,062 | 5 | 3 | 3.97 |
Food for the Hungry | 17,974 | 2 | 4 | 3.75 |
Jesuit Refugee Service | 14,854 | 1 | 1 | 3.10 |
AVSI Foundation | 9,768 | 2 | 3 | 2.04 |
Ministry of Education | 8,241 | 1 | 2 | 1.72 |
Action for Sustainable Change | 4,160 | 1 | 3 | 0.87 |
Nawiri Children Development Program | 3,487 | 1 | 2 | 0.73 |
Mondi | 2,197 | 1 | 1 | 0.46 |
Qatar Charity | 1,541 | 1 | 1 | 0.32 |
The Girl Child Network | 1,050 | 2 | 1 | 0.22 |
Bartabwa | 849 | 1 | 1 | 0.18 |
Special Olympics Kenya | 848 | 3 | 1 | 0.18 |
County Director of Education Mandera | 600 | 1 | 1 | 0.13 |
Frontiers Community Development Program | 491 | 1 | 1 | 0.10 |
County Director of Education Wajir | 361 | 1 | 1 | 0.08 |
ERIKs Development Partner | 249 | 1 | 1 | 0.05 |
Servants of the Poor | 202 | 1 | 1 | 0.04 |
Windle International Kenya | 196 | 1 | 1 | 0.04 |
Dignitas | 135 | 1 | 1 | 0.03 |
SMB | 135 | 1 | 1 | 0.03 |
Missionary Sisters of the Catechism | 85 | 1 | 1 | 0.02 |
Voluntary Service Overseas | 42 | 1 | 1 | 0.01 |
Futebol da Forcaa | 40 | 1 | 1 | 0.01 |
Evangelizing Sisters of Mary | 23 | 1 | 1 | 0.00 |
IWS | 10 | 1 | 2 | 0.00 |
1All indicators as opposed only indicators 1, 2, 5 and 6 |
2Percentage of reached for all indicators |
4. Schools and education level
4.1 Schools
The number of schools reached by school feeding programmes and WASH
in schools interventions to-date are:

However, reporting the overall number of schools reached by all EiE
interventions is much more challenging.
Whilst all partners working on indicators 2 and 4 submitted the
number of schools they were working in, the same is not true for the
other indicators. Only indicators 2 and 4 require the reporting of the
number of schools.
4.2 Education level
The data collected on education level is muddled: the combination of
various categories (such as ECE & Primary and
All Basic Education) hampers a clean breakdown by education
level:
Children reached by education leveleducation_level | children | %_of_total |
|---|
Primary | 247,601 | 55.04 |
ECE & Primary | 134,071 | 29.80 |
All Basic Education | 26,104 | 5.80 |
ECE | 24,084 | 5.35 |
Secondary | 17,976 | 4.00 |
Vocational | 23 | 0.01 |
Tertiary | 20 | 0.00 |
For instance, it is not possible to calculate the number of children
served from primary-level institutions.
To understand reporting around the mismatch of education-level
categories, let us examine individual indicators. In the plot below,
children reached have been broken down by education level and by
indicator. The category All Basic Education, whilst present
in all of the indicators, is most heavily used in the WASH-in-schools
intervention. Additionally, this indicator is used by 5 different
implementing partners.

5. Reference maps and tables
5.1 Reference maps
IPC data extracted from here.

5.2 Reference table
Download the EiE 5Ws data here
As a refresher for the reference table below, the indicators are:
indicator |
|---|
indicator 1 # of children and youth accessing ECD spaces/schools in drought affected areas |
indicator 2 # of schools/ECD spaces with feeding programmes |
indicator 3 # of learners and teachers reached with learning and teaching materials |
indicator 4 # of schools with adequate quantites of safe water for drinking and personal hygiene |
indicator 5 # of teachers / educators trained on resilience enhancing programmes (MHPSS, DRR & Life Skills, etc) |
indicator 6 # of children and youth benefiting from resilience enhancing programmes (MHPSS, DRR & Life Skills, etc) |
LS0tDQp0aXRsZTogIktlbnlhIEVkdWNhdGlvbiBpbiBFbWVyZ2VuY2llcyBXb3JraW5nIEdyb3VwIC0tIERyb3VnaHQgNVdzIFJlcG9ydCINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBjb2xsYXBzZWQ6IG5vDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDUwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9rZW55YS1laWUtd2cvZWllX3dnXzV3cy9tYWluL2VpZV93Z19sb2dvLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzdHJpbmdpKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGhlcmUpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoYW55dGltZSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KGdnc2ZsYWJlbCkNCg0KdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpDQoNCiMgSW5zdGFsbGF0aW9uIG9mIG1kZXByaXYgcGFja2FnZQ0KIyBpbnN0YWxsIHBhY2thZ2UgZGV2dG9vbHMgaWYgbm90IHlldCBpbnN0YWxsZWQNCiMgICBpbnN0YWxsLnBhY2thZ2VzKCJkZXZ0b29scyIpDQoNCiMgaW5zdGFsbCBmYXN0IGZyb20gR2l0SHViIHdpdGhvdXQgdmlnbmV0dGVzIA0KIyAgIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiYS1iZW5pbmkvbWRlcHJpdiIsIGJ1aWxkX3ZpZ25ldHRlcyA9IEZBTFNFDQoNCiMgQWx0ZXJuYXRpdmVseSwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaGVyZTogaHR0cHM6Ly9hLWJlbmluaS5naXRodWIuaW8vbWRlcHJpdi8NCg0KIyBkaXNhYmxpbmcgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSAxMDApDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KIyBmdW5jdGlvbiBmb3IgdHJhbnNwb3NpbmcgZGYNCnRyYW5zcG9zZV9kZiA8LSBmdW5jdGlvbihkZikgew0KICB0X2RmIDwtIGRhdGEudGFibGU6OnRyYW5zcG9zZShkZikNCiAgY29sbmFtZXModF9kZikgPC0gcm93bmFtZXMoZGYpDQogIHJvd25hbWVzKHRfZGYpIDwtIGNvbG5hbWVzKGRmKQ0KICB0X2RmIDwtIHRfZGYgJT4lDQogICAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oLmRhdGEgPSAuKSAlPiUNCiAgICB0aWJibGU6OmFzX3RpYmJsZSguKQ0KICByZXR1cm4odF9kZikNCn0NCg0KIyBzY2FsaW5nIGZ1bmN0aW9ucyANCnJhbmdlMDEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSl9DQpyYW5nZV93bmEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgsIG5hLnJtID0gVFJVRSkpLyhtYXgoeCwgbmEucm0gPSBUUlVFKS1taW4oeCwgbmEucm0gPSBUUlVFKSl9DQoNCiMgbW9kZSBmdW5jdGlvbiANCm1vZGUgPC0gZnVuY3Rpb24oeCkgew0KICB1eCA8LSB1bmlxdWUoeCkNCiAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXQ0KfQ0KDQojIEZpeGluZyBkYXRlcw0KbmFtZV90b19kYXRlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgbHVicmlkYXRlOjptZHkoaWZlbHNlKHggJWluJSBjKG1vbnRoLm5hbWUsIG1vbnRoLmFiYiksIHBhc3RlMCh4LCAiLzAxLzIwMjMiKSwgeCkpDQp9DQpgYGANCg0KDQoNCg0KYGBge3J9DQpsb2NhdGlvbnMgPC0gcmVhZF94bHN4KCIuL2RhdGEva2VuX2FkbWluYm91bmRhcmllc190YWJ1bGFyZGF0YS54bHN4IiwgDQogICAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAiQURNMiIpICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KDQplaWUgPC0gcmVhZF9jc3YoIi4vZGF0YS9laWVfNXdzLmNzdiIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShpbmRpY2F0b3Jfc2hvcnQpKQ0KDQpyZXBvcnRfZGF0ZSA8LSAiMjUgSnVuZSAyMDIzIg0KDQpyZXBvcnRfbW9udGggPC0gIkp1bmUiDQoNCnNpdHJlcF90YWJsZSA8LSByZWFkX3hsc3goIi4vZGF0YS9zaXRyZXBfcmVzdWx0c190YWJsZS54bHN4IikgJT4lIA0KICBjbGVhbl9uYW1lcygpDQoNCnRhcmdldHMgPC0gcmVhZF9jc3YoIi4vZGF0YS9laWVfdGFyZ2V0cy5jc3YiKQ0KDQpwY29kZTFfc2hhcGUgPC0gDQogIHNmOjpzdF9yZWFkKCIuL2RhdGEva2VuX2FkbV9pZWJjXzIwMTkxMDMxX3NocC9rZW5fYWRtYm5kYV9hZG0xX2llYmNfMjAxOTEwMzEuc2hwIiwgDQogICAgICAgICAgcXVpZXQgPSBUUlVFKSAlPiUgDQogIGNsZWFuX25hbWVzKCkNCg0KaXBjIDwtIHJlYWRfY3N2KCIuL2RhdGEvaXBjLmNzdiIpDQoNCnBhcnRuZXJfbGlzdF9jb3VudGllcyA8LSByZWFkX2NzdigiLi9kYXRhL3BhcnRuZXJfbGlzdF9jb3VudGllcy5jc3YiKSAlPiUgDQogIGZpbHRlcihwYXJ0bmVyX3R5cGUgPT0gImltcGxlbWVudGluZ19wYXJ0bmVyIikNCmBgYA0KDQoNCg0KPGJyPjxicj48YnI+DQoNCiMgMS4gU3VtbWFyeQ0KDQojIyAxLjEgU3VtbWFyeSB0YWJsZQ0KDQpgYGB7cn0NCnN1bV9zdGF0cyA8LSBlaWUgJT4lICANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIA0KICAgICAgICAgICAgY291bnRpZXMgPSBuX2Rpc3RpbmN0KGNvdW50eSksIA0KICAgICAgICAgICAgcmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBtZW4gPSBzdW0obWVuW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDV8NiIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICB3b21lbiA9IHN1bSh3b21lbltzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjF8Mnw1fDYiKSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYm95cyA9IHN1bShib3lzW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDV8NiIpICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgZ2lybHMgPSBzdW0oZ2lybHNbc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxfDJ8NXw2IikgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICByZWFjaGVkXzEyNTYgPSBzdW0odG90YWxfcmVhY2hlZFtzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjF8Mnw1fDYiKSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGxhdGVzdF9yZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWRbc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxfDJ8NXw2IikgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aCAlaW4lIHJlcG9ydF9tb250aF0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCg0KYGBgDQoNCkEgdG90YWwgb2YgYHIgc3VtX3N0YXRzICU+JSBwdWxsKHJlYWNoZWRfMTI1NikgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgaGF2ZSBiZWVuIHJlYWNoZWQgYnkgRWlFIGFjdGl2aXRpZXMgaW4gMjAyMywgb2Ygd2hpY2ggYHIgc3VtX3N0YXRzICU+JSBwdWxsKGJveXMpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMsIGByIHN1bV9zdGF0cyAlPiUgcHVsbChnaXJscykgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgZ2lybHMsIGByIHN1bV9zdGF0cyAlPiUgcHVsbChtZW4pICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIG1lbiBhbmQgYHIgc3VtX3N0YXRzICU+JSBwdWxsKHdvbWVuKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSB3b21lbi4gQmVsb3cgaXMgYSBzdW1tYXJ5IGJ5IGluZGljYXRvci4gDQoNCg0KDQo8YnI+DQoNCmBgYHtyfQ0KDQoNCnN1bW1hcnlfdGFibGUgPC0gZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBtdXRhdGUobGF0ZXN0X3JlYWNoZWQgPSBpZmVsc2UobW9udGggJWluJSByZXBvcnRfbW9udGgsIHRvdGFsX3JlYWNoZWQsIE5BX2ludGVnZXJfKSkgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIA0KICAgICAgICAgICAgY291bnRpZXMgPSBuX2Rpc3RpbmN0KGFkbTFfcGNvZGUpLCAgIA0KICAgICAgICAgICAgbGF0ZXN0X3JlYWNoZWQgPSBzdW0obGF0ZXN0X3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgdG90YWxfcmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGFkb3JuX3RvdGFscygicm93IiwsLCwgbGF0ZXN0X3JlYWNoZWQsIHRvdGFsX3JlYWNoZWQpICU+JSANCiAgbXV0YXRlKHBhcnRuZXJzID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCBzdW1fc3RhdHMkcGFydG5lcnMsIHBhcnRuZXJzKSwgDQogICAgICAgICBjb3VudGllcyA9IGlmZWxzZShpbmRpY2F0b3Jfc2hvcnQgPT0gIlRvdGFsIiwgc3VtX3N0YXRzJGNvdW50aWVzLCBjb3VudGllcyksIA0KICAgICAgICAgdG90YWxfcmVhY2hlZCA9IGlmZWxzZShpbmRpY2F0b3Jfc2hvcnQgPT0gIlRvdGFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9zdGF0cyRyZWFjaGVkXzEyNTYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9yZWFjaGVkKSwgDQogICAgICAgICBsYXRlc3RfcmVhY2hlZCA9IGlmZWxzZShpbmRpY2F0b3Jfc2hvcnQgPT0gIlRvdGFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1fc3RhdHMkbGF0ZXN0X3JlYWNoZWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0X3JlYWNoZWQpKSAlPiUgDQogIGxlZnRfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKHRhcmdldF91bml0ID09ICJwZW9wbGUiKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0KSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHRhcmdldCA9IHN1bShjb3VudHlfdGFyZ2V0KSksIA0KICAgICAgICAgICAgYnkgPSAiaW5kaWNhdG9yX3Nob3J0IikgJT4lIA0KICBtdXRhdGUodGFyZ2V0ID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzICU+JSBkaXN0aW5jdChjb3VudHksIGNvdW50eV9vdmVyYWxsX3RhcmdldCkgJT4lIHtzdW0oLiRjb3VudHlfb3ZlcmFsbF90YXJnZXQpfSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KSkgJT4lIA0KICBtdXRhdGUocGMgPSByb3VuZCh0b3RhbF9yZWFjaGVkIC8gdGFyZ2V0ICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lDQogIHNlbGVjdChpbmRpY2F0b3IgPSBpbmRpY2F0b3Jfc2hvcnQsIHBhcnRuZXJzLCBjb3VudGllcywgDQogICAgICAgICBsYXRlc3RfcmVhY2hlZCwgdG90YWxfcmVhY2hlZCwgdGFyZ2V0LCBgJXRhcmdldF9yZWFjaGVkYCA9IHBjKSAlPiUNCiAgc2VsZWN0X2FsbCh+IGdzdWIoImxhdGVzdCIsIA0KICAgICAgICAgICAgICAgICAgICByZXBvcnRfbW9udGgsIC4pKSAlPiUNCiAgc2VsZWN0X2FsbCh+IHN0cl90b190aXRsZSguKSkgIA0KDQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJTdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIEVJRSA1V3MgcmVwb3J0aW5nLCAiLCByZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgJT4lIA0KICBmb250c2l6ZShpID0gMTo2LCBqID0gMSwgc2l6ZSA9IDkpICU+JSANCiAgZm9udHNpemUoc2l6ZSA9IDksIHBhcnQgPSAiaGVhZGVyIikgJT4lIA0KICBmb290bm90ZShpID0gMSwgaiA9IDIsIHBhcnQgPSAiaGVhZGVyIiwgcmVmX3N5bWJvbHMgPSAiMSIsIA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIk9ubHkgaW1wbGVtZW50aW5nIHBhcnRuZXJzIikpICU+JSANCiAgZm9vdG5vdGUoaSA9IDcsIGogPSA1OjYsIHJlZl9zeW1ib2xzID0gIjIiLCANCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJPbmx5IHRoZSBzdW0gb2YgaW5kaWNhdG9ycyAxLCAyLCA1IGFuZCA2IikpDQoNCiAgDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDEuMiBCeSBzZXggYW5kIGFnZQ0KDQoNCmBgYHtyfQ0KZWllICU+JSANCiAgbXV0YXRlKGluZGljYXRvcl9zaG9ydCA9IGZjdF9yZXYoaW5kaWNhdG9yX3Nob3J0KSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGJveXMsIGdpcmxzLCBtZW4sIHdvbWVuKSwgfiByZXBsYWNlX25hKC4sIDApKSAlPiUgDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBzdW1tYXJpc2VfYXQodmFycyhib3lzLCBnaXJscywgbWVuLCB3b21lbiksIH4gc3VtKC4sIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbXV0YXRlKHRvdGFsX3JlYWNoZWQgPSBib3lzICsgZ2lybHMgKyBtZW4gKyB3b21lbiwgDQogICAgICAgICBmZW1hbGUgPSAod29tZW4gKyBnaXJscykgLyB0b3RhbF9yZWFjaGVkLCANCiAgICAgICAgIG1hbGUgPSAoYm95cyArIG1lbikgLyB0b3RhbF9yZWFjaGVkKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGZlbWFsZSwgbWFsZSksIA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAic2V4IiwgDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicGMiKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBjLCB5ID0gaW5kaWNhdG9yX3Nob3J0LCBmaWxsID0gc2V4KSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKHggPSBwYywgDQogICAgICAgICAgICAgICAgeSA9IGluZGljYXRvcl9zaG9ydCwgDQogICAgICAgICAgICAgICAgbGFiZWwgPSBwZXJjZW50KHBjLCBhY2N1cmFjeSA9IDEpKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAuNSksIA0KICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNDQzOTgzIiwgIiMzNWI3NzkiKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudCkgKyANCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiU2V4IGJyZWFrZG93biBieSBpbmRpY2F0b3IiKSAgDQoNCmBgYA0KDQo8YnI+DQoNCk9ubHkgSW5kaWNhdG9yIDYsIENoaWxkcmVuIGJlbmVmaXRpbmcgZnJvbSByZXNpbGllbmNlLWVuaGFuY2luZyBwcm9ncmFtbWluZywgc2VlcyBhIGhpZ2hlciBwcm9wb3J0aW9uIG9mIGZlbWFsZXMgcmVhY2hlZCBvdmVyIG1lbi4gDQoNCjxicj4NCg0KYGBge3IgZmlnLmhlaWdodD02fQ0KZWllICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYm95cywgZ2lybHMsIG1lbiwgd29tZW4pLCB+IHJlcGxhY2VfbmEoLiwgMCkpICU+JQ0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgc3VtbWFyaXNlX2F0KHZhcnMobWVuLCB3b21lbiwgYm95cywgZ2lybHMpLCB+IHN1bSguKSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKG1lbiwgd29tZW4sIGJveXMsIGdpcmxzKSwgDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJ0eXBlIiwgDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicmVhY2hlZCIpICU+JSANCiAgbXV0YXRlKHR5cGUgPSBzdHJfdG9fdGl0bGUodHlwZSksIA0KICAgICAgICAgdHlwZSA9IGZjdF9yZWxldmVsKHR5cGUsIGMoIk1lbiIsICJXb21lbiIsICJCb3lzIiwgIkdpcmxzIikpKSAlPiUgDQogICMgWW91J3JlIGp1c3QgZmlsdGVyaW5nIHRoZW0gb3V0IG1hbnVhbGx5DQogIG11dGF0ZShyZWFjaGVkID0gY2FzZV93aGVuKA0KICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgdHlwZSA9PSAiQm95cyIgfiAwLCANCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSAmIHR5cGUgPT0gIkdpcmxzIiB+IDAsIA0KICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNiIpICYgdHlwZSA9PSAiTWVuIiB+IDAsIA0KICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNiIpICYgdHlwZSA9PSAiV29tZW4iIH4gMCwgDQogICAgVFJVRSB+IHJlYWNoZWQNCiAgKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSB0eXBlLCB4ID0gcmVhY2hlZCwgZmlsbCA9IHR5cGUpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShyZWFjaGVkKSksIA0KICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpLCANCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBudW1iZXJfZm9ybWF0KHNjYWxlID0gMSAvIDEwMDAsIHN1ZmZpeCA9ICJLIikpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QoYmVnaW4gPSAuMiwgZW5kID0gLjkpICsgDQogIGZhY2V0X3dyYXAofiBpbmRpY2F0b3Jfc2hvcnQsIHNjYWxlcyA9ICJmcmVlX3giKSArIA0KICBsYWJzKHggPSAiUGVyc29ucyByZWFjaGVkIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJSZWFjaCBkaXNhZ2dyZWdhdGVkIGJ5IHNleCwgYWdlIGFuZCBpbmRpY2F0b3IiKQ0KDQoNCmBgYA0KDQoNCg0KPGJyPjxicj48YnI+DQoNCg0KIyMgMS4zIEJ5IGNvdW50eQ0KDQpgYGB7cn0NCmN1bV9wYzwtIGVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoY291bnR5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHNlY3Rvcl9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGxlZnRfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QoY291bnR5LCB0YXJnZXQgPSBjb3VudHlfb3ZlcmFsbF90YXJnZXQpLCANCiAgICAgICAgICAgIGJ5ID0gImNvdW50eSIpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KHRhcmdldCA9IDApKSAlPiUgDQogIG11dGF0ZShwY19iZW4gPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBwY190YXJnZXQgPSByb3VuZCh0YXJnZXQgLyBzdW0odGFyZ2V0KSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShjdW1fcGMgPSBjdW1zdW0ocGNfYmVuKSkNCmBgYA0KDQpgciBjdW1fcGMgJT4lIGZpbHRlcihjb3VudHkgPT0gIlR1cmthbmEiKSAlPiUgcHVsbChjdW1fcGMpYCUgb2YgYWxsIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBvcmlnaW5hdGUgZnJvbSBUdXJrYW5hLCB0aG91Z2ggaXQgb25seSBoYXMgYHIgY3VtX3BjICU+JSBmaWx0ZXIoY291bnR5ID09ICJUdXJrYW5hIikgJT4lIHB1bGwocGNfdGFyZ2V0KWAlIG9mIHRoZSB0YXJnZXRlZCBwb3B1bGF0aW9uLiANCg0KPGJyPg0KDQpgYGB7cn0NCg0KZWllICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSwgY291bnR5KSAlPiUgDQogIHN1bW1hcmlzZShzZWN0b3JfcmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGxlZnRfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QoY291bnR5LCB0YXJnZXQgPSBjb3VudHlfb3ZlcmFsbF90YXJnZXQpLCANCiAgICAgICAgICAgIGJ5ID0gImNvdW50eSIpICU+JSAgDQogIG11dGF0ZShjb3VudHkgPSBmY3RfcmVvcmRlcihjb3VudHksIHNlY3Rvcl9yZWFjaGVkKSkgJT4lIA0KICBmaWx0ZXIoc2VjdG9yX3JlYWNoZWQgPiAwIHwgdGFyZ2V0ID4gMCkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFkbTFfcGNvZGUsIHBlcmNlbnRfcGhhc2VfcDMpLCANCiAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhzZWN0b3JfcmVhY2hlZCwgdGFyZ2V0KSwgDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJ0eXBlIiwgDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUgDQogIG11dGF0ZSh0eXBlID0gaWZlbHNlKHR5cGUgPT0gInRhcmdldCIsICJDb3VudHkgVGFyZ2V0IiwgIlNlY3RvciBSZWFjaGVkIikpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KHZhbHVlID0gMCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSB2YWx1ZSwgDQogICAgICAgICAgICAgeSA9IGNvdW50eSwgDQogICAgICAgICAgICAgZmlsbCA9IHBlcmNlbnRfcGhhc2VfcDMpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYSh2YWx1ZSkpLCBoanVzdCA9ICJpbndhcmQiKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBudW1iZXJfZm9ybWF0KHNjYWxlID0gMS8xMDAwLCBzdWZmaXggPSAiSyIpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAiaW5mZXJubyIsIGJlZ2luID0gLjQsICwgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGVyY2VudCkgKyANCiAgZmFjZXRfZ3JpZCh+IHR5cGUsIHNjYWxlcyA9ICJmcmVlX3giLCBzcGFjZSA9ICJmcmVlIikgKyANCiAgbGFicyhmaWxsID0gIiUgSVBDMysiLA0KICAgICAgIHggPSAiVGFyZ2V0L3JlYWNoZWQiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIGNhcHRpb24gPSAiQ29sb3VycyByZWZlciB0byAlIG9mIGNvdW50eSBwb3B1bGF0aW9uIGluIElQQyBwaGFzZSAzIG9yIGFib3ZlLiBIb21hIEJheSB3YXMgbm90IGFzc2Vzc2VkIGFzIHBhcnQgb2YgdGhlIElQQyBDbGFzc2lmaWNhdGlvbiIsIA0KICAgICAgIHRpdGxlID0gIkNvbXBhcmlzb24gYmV0d2VlbiB0YXJnZXRzIGFuZCByZWFjaGVkIikgKw0KICB0aGVtZSgjIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1LCBhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSksIA0KICAgICAgICAjIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwgDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpLCANCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpKQ0KYGBgDQoNCklQQyBkYXRhIGV4dHJhY3RlZCBmcm9tIFtoZXJlXShodHRwczovL3d3dy5pcGNpbmZvLm9yZy9pcGMtY291bnRyeS1hbmFseXNpcy9kZXRhaWxzLW1hcC9lbi9jLzExNTYyMTAvP2lzbzM9S0VOKS4NCg0KPGJyPjxicj48YnI+DQoNCg0KDQojIDIuIFByb2dyZXNzIGJ5IGluZGljYXRvcg0KDQojIyAyLjEgT3ZlcmFsbCBwcm9ncmVzcw0KDQoNCg0KYGBge3IgZmlnLmhlaWdodD02fQ0KDQpsaW5lX3ZhbHVlcyA8LSBlaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKQ0KDQoNCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlKGRhdGUgPSBuYW1lX3RvX2RhdGUobW9udGgpKSAlPiUgDQogIGdyb3VwX2J5KGRhdGUsIGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9iZW4gPSBjdW1zdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgYXJyYW5nZShpbmRpY2F0b3Jfc2hvcnQpICU+JSAgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fYmVuLCBjb2xvdXIgPSBpbmRpY2F0b3Jfc2hvcnQpKSArIA0KICBnZW9tX3N0ZXAoc2l6ZSA9IDEpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpKSwgDQogICAgICAgICAgICB4ID0gLUluZiwgeSA9IEluZiwgaGp1c3QgPSAtMC4xNSwgdmp1c3QgPSAwLjksIGRhdGEgPSBsaW5lX3ZhbHVlcykgKyANCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCBkYXRlX2xhYmVscyA9ICIlYiIpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKyANCiAgZmFjZXRfd3JhcCh+aW5kaWNhdG9yX3Nob3J0LCBzY2FsZXMgPSAiZnJlZV95IikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiwgYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLCANCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLCANCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIiksIA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICsgDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgaW50ZXJ2ZW50aW9ucyIsIA0KICAgICAgIHRpdGxlID0gcGFzdGUwKCJNb250aGx5IHByb2dyZXNzIGJ5IGFjdGl2aXR5LCAiLCByZXBvcnRfZGF0ZSksDQogICAgICAgc3VidGl0bGUgPSAiSW5kaWNhdG9yIHN1YnRvdGFsIGluIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgZWFjaCBmYWNldCIpIA0KICANCg0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCg0KIyMgMi4yIFJlYWNoZWQgYnkgaW5kaWNhdG9yDQoNCmBgYHtyfQ0KYmVuX3Bsb3QgPC0gZnVuY3Rpb24odGJsKSB7DQogIHRibCAlPiUgDQogICAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0LCBjb3VudHkpICU+JSANCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogICAgZnVsbF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCAlaW4lIGMoInBlb3BsZSIpKSAlPiUgDQogICAgICAgICAgICAgICAgc2VsZWN0KGNvdW50eSwgaW5kaWNhdG9yX3Nob3J0LCBjb3VudHlfdGFyZ2V0KSwgDQogICAgICAgICAgICAgIGJ5ID0gYygiY291bnR5IiwgImluZGljYXRvcl9zaG9ydCIpKSAlPiUgDQogICAgcmVwbGFjZV9uYShsaXN0KGNvdW50eV90YXJnZXQgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IDApKSAlPiUgDQogICAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogICAgbXV0YXRlKHBjID0gaWZlbHNlKGNvdW50eV90YXJnZXQgPiAwLCBiZW5lZmljaWFyaWVzIC8gY291bnR5X3RhcmdldCwgMCksIA0KICAgICAgICAgICBjb3VudHkgPSBmY3RfcmVvcmRlcihjb3VudHksIGJlbmVmaWNpYXJpZXMpKSAlPiUgIA0KICAgIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSBjb3VudHkpKSArIA0KICAgIGdlb21fY29sKGFlcyhmaWxsID0gcGMpKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpLCBoanVzdCA9ICJpbndhcmQiKSwgDQogICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiKSArIA0KICAgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXJlY3Rpb24gPSAtMSwgb3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGVyY2VudCwgYmVnaW4gPSAuMikgKyANCiAgICBsYWJzKHRpdGxlID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCIsIA0KICAgICAgICAgeCA9ICJCZW5lZmljaWFyaWVzIiwgDQogICAgICAgICB5ID0gIiIsIA0KICAgICAgICAgZmlsbCA9ICIlIHJlYWNoZWQiKSANCn0NCg0KcGNfcGxvdCA8LSBmdW5jdGlvbih0YmwpIHsNCiAgdGJsICU+JSANCiAgICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eSkgJT4lIA0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgICBmdWxsX2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKHRhcmdldF91bml0ICVpbiUgYygicGVvcGxlIikpICU+JSANCiAgICAgICAgICAgICAgICBzZWxlY3QoY291bnR5LCBpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eV90YXJnZXQpLCANCiAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHkiLCAiaW5kaWNhdG9yX3Nob3J0IikpICU+JSANCiAgICByZXBsYWNlX25hKGxpc3QoY291bnR5X3RhcmdldCA9IDAsIA0KICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gMCkpICU+JSANCiAgICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgICBtdXRhdGUocGMgPSBpZmVsc2UoY291bnR5X3RhcmdldCA+IDAsIGJlbmVmaWNpYXJpZXMgLyBjb3VudHlfdGFyZ2V0LCAwKSwgDQogICAgICAgICAgIGNvdW50eSA9IGZjdF9yZW9yZGVyKGNvdW50eSwgYmVuZWZpY2lhcmllcykpICU+JSAgDQogICAgZ2dwbG90KGFlcyh4ID0gcGMsIHkgPSBjb3VudHkpKSArIA0KICAgIGdlb21fY29sKGFlcyhmaWxsID0gcGMpKSArIA0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KHBjLCBhY2N1cmFjeSA9IC4xKSwgaGp1c3QgPSAiaW53YXJkIiksIA0KICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IikgKyANCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudCkgKw0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXJlY3Rpb24gPSAtMSwgb3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGVyY2VudCwgYmVnaW4gPSAuMikgKyANCiAgICBsYWJzKHRpdGxlID0gIiUgb2YgdGFyZ2V0IHJlYWNoZWQiLCANCiAgICAgICAgIHggPSAiJSByZWFjaGVkIiwgDQogICAgICAgICB5ID0gIiIsIA0KICAgICAgICAgZmlsbCA9ICIlIHJlYWNoZWQiKSArDQogICAgDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KfQ0KYGBgDQoNCmBgYHtyfQ0KdGFyZ2V0c19yYW5nZSA8LSB0YXJnZXRzICU+JSANCiAgZmlsdGVyKHRhcmdldF91bml0ID09ICJwZW9wbGUiKSAlPiUgDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgY291bnR5KSAlPiUgDQogIHN1bW1hcmlzZSh0YXJnZXQgPSBzdW0oY291bnR5X3RhcmdldCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW5kaWNhdG9yX3Nob3J0LCB2YWx1ZXNfZnJvbSA9IHRhcmdldCkgJT4lIA0KICBzZXROYW1lcyhjKCJjb3VudHkiLCAiaW5kaWNhdG9yMSIsICJpbmRpY2F0b3IyIiwgImluZGljYXRvcjMiLCAiaW5kaWNhdG9yNCIsIA0KICAgICAgICAgICAgICJpbmRpY2F0b3I1IiwgImluZGljYXRvcjYiKSkNCg0KaW5kaWNhdG9yX21hcCA8LSBmdW5jdGlvbih0YmwsIGluZGljYXRvcl9udW1iZXIsIHBsb3Rfb3B0aW9uKSB7DQogIA0KICBwbG90X29wdGlvbiA8LSBlbnF1byhwbG90X29wdGlvbikNCiAgaW5kaWNhdG9yX251bWJlciA8LSBlbnF1byhpbmRpY2F0b3JfbnVtYmVyKQ0KICANCiAgdGJsICU+JSANCiAgICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICEhaW5kaWNhdG9yX251bWJlcikpICU+JSANCiAgICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eSkgJT4lIA0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgICBmdWxsX2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAhIWluZGljYXRvcl9udW1iZXIpKSAlPiUNCiAgICAgICAgICAgICAgICBmaWx0ZXIodGFyZ2V0X3VuaXQgJWluJSBjKCJwZW9wbGUiKSkgJT4lIA0KICAgICAgICAgICAgICAgIHNlbGVjdChjb3VudHksIGluZGljYXRvcl9zaG9ydCwgY291bnR5X3RhcmdldCksIA0KICAgICAgICAgICAgICBieSA9IGMoImNvdW50eSIsICJpbmRpY2F0b3Jfc2hvcnQiKSkgJT4lIA0KICAgIHJlcGxhY2VfbmEobGlzdChjb3VudHlfdGFyZ2V0ID0gMCwgDQogICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lIA0KICAgIGZpbHRlcihiZW5lZmljaWFyaWVzID4gMCB8IGNvdW50eV90YXJnZXQgPiAwKSAgJT4lIA0KICAgIG11dGF0ZShwYyA9IGlmZWxzZShjb3VudHlfdGFyZ2V0ID4gMCwgYmVuZWZpY2lhcmllcyAvIGNvdW50eV90YXJnZXQsIDApLCANCiAgICAgICAgICAgY291bnR5ID0gZmN0X3Jlb3JkZXIoY291bnR5LCBiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAgIG5hbmlhcjo6cmVwbGFjZV93aXRoX25hKGxpc3QoYmVuZWZpY2lhcmllcyA9IDApKSAlPiUgDQogICAgbGVmdF9qb2luKGxvY2F0aW9ucyAlPiUgDQogICAgICAgICAgICAgICAgZGlzdGluY3QoY291bnR5ID0gYWRtMV9lbiwgYWRtMV9wY29kZSksIA0KICAgICAgICAgICAgICBieSA9ICJjb3VudHkiKSAlPiUgDQogICAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIGJ5ID0gYygiYWRtMV9wY29kZSIpKSAlPiUNCiAgICBzdF9hc19zZigpICU+JSANCiAgICBnZ3Bsb3QoKSArIA0KICAgIGdlb21fc2Yoc2l6ZSA9IC4wMSwgY29sb3VyID0gImdyZXk3MCIsIA0KICAgICAgICAgICAgYWVzKGZpbGwgPSAhIXBsb3Rfb3B0aW9uKSkgKyANCiAgICBnZW9tX3NmX3RleHQoYWVzKGxhYmVsID0gY29tbWEoISFwbG90X29wdGlvbikpLA0KICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IiwNCiAgICAgICAgICAgICAgICAgc2l6ZSA9IDIuNSkgKyANCiAgICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgICB0aGVtZV92b2lkKCkgKyANCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpKQ0KICAgIA0KfQ0KDQpgYGANCg0KIyMjIDIuMi4xIEFjY2VzcyB0byBFQ0Qgc3BhY2VzL3NjaG9vbHMNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICIxIikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgMSwgYXMgb2YgIiwgcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpDQoNCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICIxIiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICIxIiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yMSksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMS4gQWNjZXNzIHRvIEVDRCBzcGFjZXMvc2Nob29scywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcmVwb3J0X2RhdGUpKSANCg0KYGBgDQoNCg0KDQo8YnI+DQoNCkluIGByIHJlcG9ydF9tb250aGAgMjAyMywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYm95cywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgYm95cyBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRnaXJscywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgZ2lybHMuDQoNCjxicj4NCg0KYGBge3IgZmlnLmhlaWdodD02fQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSkgJT4lIA0KICBiZW5fcGxvdCgpICsNCiAgDQpwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMS4gQ2hpbGRyZW4gYWNjZXNzaW5nIEVDRCBzcGFjZXMvc2Nob29scywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCB0YXJnZXRzIGhhdmUgMCUgcmVhY2hlZCIpDQoNCiANCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDIuMi4yIFNjaG9vbCBmZWVkaW5nIHByb2dyYW1tZXMNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICIyIikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgMiwgYXMgb2YgIiwgcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpIA0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjIiLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjIiLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3IyKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIyLiBTY2hvb2wgZmVlZGluZyBwcm9ncmFtbWVzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCByZXBvcnRfZGF0ZSkpIA0KDQogIA0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjIiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRib3lzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBnaXJscy4gDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMiIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIyLiBGZWVkaW5nIHByb2dyYW1tZXMiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0IHRhcmdldHMgaGF2ZSAwJSByZWFjaGVkIikNCg0KDQpgYGANCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDIuMi4zIFRlYWNoaW5nIGFuZCBsZWFybmluZyBtYXRlcmlhbHMNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICIzIikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgMywgYXMgb2YgIiwgcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpIA0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjMiLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjMiLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3IzKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIzLiBUZWFjaGluZyBhbmQgbGVhcm5pbmcgbWF0ZXJpYWxzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCByZXBvcnRfZGF0ZSkpIA0KDQogIA0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRib3lzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzLCAgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRnaXJscywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgZ2lybHMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kbWVuLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBtZW4gYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kd29tZW4sIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIHdvbWVuLiANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjMuIFRlYWNoaW5nIG1hdGVyaWFscyIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgdGFyZ2V0cyBoYXZlIDAlIHJlYWNoZWQiKQ0KDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDIuMi40IFNhZmUgd2F0ZXIsIHBlcnNvbmFsIGh5Z2llbmUNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICI0IikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgNCwgYXMgb2YgIiwgcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpIA0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjQiLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjQiLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3I0KSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI0LiBTYWZlIHdhdGVyLCBwZXJzb25hbCBoeWdpZW5lLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCByZXBvcnRfZGF0ZSkpIA0KDQogIA0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNCIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjQiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRib3lzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNCIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgYW5kIHdlcmUgZ2lybHMuIA0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNCIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNCIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI0LiBTYWZlIHdhdGVyLCBwZXJzb25hbCBoeWdpZW5lIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCAlIHJlYWNoZWQgaGF2ZSBubyB0YXJnZXQiKQ0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIyAyLjIuNSBFZHVjYXRvcnMgdHJhaW5lZCBpbiByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzDQoNCjxicj4NCg0KYGBge3J9DQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoSW5kaWNhdG9yLCAiNSIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDUsIGFzIG9mICIsIHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSANCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICI1IiwgY291bnR5X3RhcmdldCkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhuYS52YWx1ZSA9ICJncmV5ODAiLCBsaW1pdHMgPSByYW5nZShjKDAsIDE4MTMpKSkgKyANCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiNSIsIGJlbmVmaWNpYXJpZXMpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjUuIEVkdWNhdG9ycyB0cmFpbmVkIGluIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHJlcG9ydF9kYXRlKSkgDQoNCmBgYA0KDQo8YnI+DQoNCkluIGByIHJlcG9ydF9tb250aGAgMjAyMywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kbWVuLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBtZW4gYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kd29tZW4sIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBhbmQgd2VyZSB3b21lbi4gDQoNCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSkgJT4lIA0KICBiZW5fcGxvdCgpICsNCiAgDQpwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNS4gRWR1Y2F0b3JzIHRyYWluZWQgaW4gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcyIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgJSByZWFjaGVkIGhhdmUgbm8gdGFyZ2V0IikNCg0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIyAyLjIuNiBDaGlsZHJlbiBiZW5lZml0ZWQgZnJvbSByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzDQoNCjxicj4NCg0KYGBge3J9DQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoSW5kaWNhdG9yLCAiNiIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDYsIGFzIG9mICIsIHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSANCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICI2IiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICI2IiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yNiksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNi4gQ2hpbGRyZW4gYmVuZWZpdGVkIGZyb20gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcmVwb3J0X2RhdGUpKSANCg0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSByZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjYiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRib3lzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgYW5kIHdlcmUgZ2lybHMgDQoNCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSkgJT4lIA0KICBiZW5fcGxvdCgpICsNCiAgDQpwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNi4gQ2hpbGRyZW4gYmVuZWZpdGVkIGZyb20gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcyIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgJSByZWFjaGVkIGhhdmUgbm8gdGFyZ2V0IikNCg0KDQpgYGANCg0KDQo8YnI+PGJyPjxicj4NCg0KIyAzLiBQYXJ0bmVycw0KDQojIyAzLjEgT3BlcmF0aW9uYWwgcHJlc2VuY2Ugb2YgaW1wbGVtZW50aW5nIHBhcnRuZXJzDQoNCjxicj4NCg0KDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQ9N30NCg0KcGFydG5lcl9tYXAgPC0gZWllICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYm95cywgZ2lybHMsIG1lbiwgd29tZW4pLCB+IHJlcGxhY2VfbmEoLiwgMCkpICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSwgY291bnR5KSAlPiUgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLCANCiAgICAgICAgICAgIGxlYWRfb3JnYW5pc2F0aW9uID0gbl9kaXN0aW5jdChsZWFkX29yZ2FuaXNhdGlvbiksDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChpbmRpY2F0b3Jfc2hvcnQpLCANCiAgICAgICAgICAgIHdvbWVuID0gc3VtKHdvbWVuW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBtZW4gPSBzdW0obWVuW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYm95cyA9IHN1bShib3lzW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgZ2lybHMgPSBzdW0oZ2lybHNbYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIHNlY3Rvcl9yZWFjaGVkID0gc3VtKHNlY3Rvcl9yZWFjaGVkW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIG11dGF0ZShyZWFjaGVkID0gbWVuICsgd29tZW4gKyBib3lzICsgZ2lybHMsIA0KICAgICAgICAgbWFsZSA9IG1lbiArIGJveXMsIA0KICAgICAgICAgZmVtYWxlID0gd29tZW4gKyBnaXJscywgDQogICAgICAgICBtYWxlX3BjID0gcm91bmQobWFsZSAvIHJlYWNoZWQgKiAxMDApLCANCiAgICAgICAgIGZlbWFsZV9wYyA9IHJvdW5kKGZlbWFsZSAvIHJlYWNoZWQgKiAxMDApKSAlPiUgIA0KICBsZWZ0X2pvaW4ocGFydG5lcl9saXN0X2NvdW50aWVzICU+JQ0KICAgICAgICAgICAgICBkaXN0aW5jdChhZG0xX3Bjb2RlLCBhY3JvbnltKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtMV9wY29kZSkgJT4lDQogICAgICAgICAgICAgIGFycmFuZ2UoYWNyb255bSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYWNyb255bSA9IHBhc3RlMChhY3JvbnltLCBjb2xsYXBzZSA9ICIsICIpKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKGFjcm9ueW0gPSBzdHJfcmVwbGFjZV9hbGwoYWNyb255bSwgIkNoaWxkRnVuZCIsICJDRiIpLCANCiAgICAgICAgICAgICAgICAgICAgIG5fcGFydG5lcnMgPSBzdHJfY291bnQoYWNyb255bSwgIiwiKSArIDEpLCANCiAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBkYXRhID0gcGNvZGUxX3NoYXBlKSArIA0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IHBhcnRuZXJzLCANCiAgICAgICAgICAgICAgY29sb3VyID0gYWRtMV9wY29kZSkpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAoIA0KICAgIGNvdW50eSwgIlxuIiwgcGFydG5lcnMpLCANCiAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgICAgICAgICAgICJDb3VudHk6ICIsIGNvdW50eSwgIlxuIiwgDQogICAgICAgICAgICAgICAgIlBhcnRuZXJzOiAiLCBuX3BhcnRuZXJzLCAiXG4iLCANCiAgICAgICAgICAgICAgICAiUmVhY2hlZDogIiwgY29tbWEoc2VjdG9yX3JlYWNoZWQpLCAiXG4iLCANCiAgICAgICAgICAgICAgICAiRmVtYWxlX3JlYWNoZWQlOiAiLCBmZW1hbGVfcGMsICIlIiwgIlxuIiwgDQogICAgICAgICAgICAgICAgIk1hbGVfcmVhY2hlZCU6ICIsIG1hbGVfcGMsICIlIiwgDQogICAgICAgICAgICAgICAgIlxuIiwgIlxuIiwgDQogICAgICAgICAgICAgICAgYWNyb255bSkpLCANCiAgICAgICAgICAgICAgICBzaXplID0gMywgY29sb3VyID0gImdyYXk0MCIpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJtYWtvIiwgDQogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMSwgMywgNiwgMTApKSArIA0KICANCiAgdGhlbWVfdm9pZCgpICsgDQogICMgUmVtZW1iZXIgdGhhdCB5b3UgbmVlZCBndWlkZV9jb2xvcmJhciwgbm90IGd1aWRlX2xlZ2VuZA0KICAjIGd1aWRlcyhmaWxsID0gZ3VpZGVfY29sb3JiYXIocmV2ZXJzZSA9IFRSVUUpKSArIA0KICBsYWJzKHRpdGxlID0gIktFTllBOiBFZHVjYXRpb24gaW4gRW1lcmdlbmNpZXMgV29ya2luZyBHcm91cCBvcGVyYXRpb25hbCBwcmVzZW5jZSIsIA0KICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJhcyBvZiAiLCByZXBvcnRfZGF0ZSksIA0KICAgICAgIGZpbGwgPSAiUGFydG5lcnMiKQ0KDQoNCmdncGxvdGx5KHBhcnRuZXJfbWFwLCB0b29sdGlwID0gYygidGV4dCIpKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMChzdW1fc3RhdHMkcGFydG5lcnMsICIgRWlFIGltcGxlbWVudGluZyBwYXJ0bmVycyBhY3Jvc3MgIiwgc3VtX3N0YXRzJGNvdW50aWVzLCAiIGNvdW50aWVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXMgb2YgIiwgcmVwb3J0X2RhdGUsICI7IG1vdXNlIG92ZXIgY291bnR5IG5hbWUgZm9yIG1vcmUgZGV0YWlscyIsICI8L3N1cD4iKSkpDQpgYGANCg0KDQo8YnI+DQoNCkJlbG93IGlzIGFuIGludGVyYWN0aXZlIHRhYmxlIHdoaWNoIGFkZHMgZGV0YWlsIHRvIHRoZSBtYXAgYWJvdmUsIHNlcnZpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgY29vcmRpbmF0aW9uIC0tIGFsbG93aW5nIGludGVyZXN0ZWQgcGFydGllcyB0byBzZWFyY2ggYnkgY291bnR5IG9yIHBhcnRuZXIuIA0KDQogVGhlIGNvbHVtbiBgI0FjdGl2aXRpZXNgIHJlZmVycyB0byB0aGUgbnVtYmVyIG9mIEVkdWNhdGlvbiBhY3Rpdml0aWVzIGltcGxlbWVudGVkIGJ5IHNhaWQgcGFydG5lciBpbiBlYWNoIGNvdW50eS4gRWFjaCBjb2x1bW4gY2FuIGJlIHNvcnRlZCB3aXRoIHRoZSBhcnJvd3MgbmV4dCB0byBlYWNoIGNvbHVtbiBuYW1lLiBFYWNoIGNvbHVtbiBjYW4gYWxzbyBiZSBmaWx0ZXJlZCBieSB0eXBpbmcgaW50byB0aGUgc2VhcmNoIGJhciBiZWxvdyBlYWNoIGNvbHVtbiBuYW1lLiBPbmx5IGNvbXBsZXRlZCBhY3Rpdml0aWVzIGhhdmUgYmVlbiBpbmNsdWRlZC4NCiANCmBgYHtyfQ0KZWllICU+JQ0KICBtdXRhdGVfYXQodmFycyhpbXBsZW1lbnRpbmdfcGFydG5lciwgbGVhZF9vcmdhbmlzYXRpb24pLCB+IA0KICAgICAgICAgICAgICBzdHJfc3ViKC4sIGVuZCA9IDUwTCkpICU+JSAgDQogIGdyb3VwX2J5KGNvdW50eSwgYWRtMV9wY29kZSwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGxlYWRfb3JnYW5pc2F0aW9uKSAlPiUgDQogIHN1bW1hcmlzZShyZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWRbYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChpbmRpY2F0b3Jfc2hvcnQpKSAlPiUgDQogIHNlbGVjdChjb3VudHksIGltcGxlbWVudGluZ19wYXJ0bmVyLCBsZWFkX29yZ2FuaXNhdGlvbiwgcmVhY2hlZCwgYCNhY3Rpdml0aWVzYCA9IGFjdGl2aXRpZXMsIGFkbTFfcGNvZGUpICU+JSANCiAgd3JpdGVfY3N2KCIuL2RhdGEvYnJlYWtkb3duX2J5X2NvdW50eV9wYXJ0bmVyLmNzdiIpDQpgYGANCiANCg0KRG93bmxvYWQgdGhlIGRhdGFzZXQgZnJvbSB0aGUgdGFibGUgYmVsb3cgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9rZW55YS1laWUtd2cvZWllX3dnXzV3cy9ibG9iL21haW4vZGF0YS9icmVha2Rvd25fYnlfY291bnR5X3BhcnRuZXIuY3N2KS4gDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGltcGxlbWVudGluZ19wYXJ0bmVyLCBsZWFkX29yZ2FuaXNhdGlvbiksIH4gDQogICAgICAgICAgICAgIHN0cl9zdWIoLiwgZW5kID0gNTBMKSkgJT4lICANCiAgZ3JvdXBfYnkoY291bnR5LCBhZG0xX3Bjb2RlLCBpbXBsZW1lbnRpbmdfcGFydG5lciwgbGVhZF9vcmdhbmlzYXRpb24pICU+JSANCiAgc3VtbWFyaXNlKHJlYWNoZWQgPSBzdW0oc2VjdG9yX3JlYWNoZWRbYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChpbmRpY2F0b3Jfc2hvcnQpKSAlPiUgDQogIGxlZnRfam9pbihwYXJ0bmVyX2xpc3RfY291bnRpZXMgJT4lIA0KICAgICAgICAgICAgICBkaXN0aW5jdChwYXJ0bmVyLCBhY3JvbnltKSwgDQogICAgICAgICAgICBieSA9IGMoImltcGxlbWVudGluZ19wYXJ0bmVyIiA9ICJwYXJ0bmVyIikpICU+JSANCiAgc2VsZWN0KGNvdW50eSwgbGVhZF9vcmdhbmlzYXRpb24sIGltcGxlbWVudGluZ19wYXJ0bmVyLCBhY3JvbnltLCByZWFjaGVkLCBgI2FjdGl2aXRpZXNgID0gYWN0aXZpdGllcywgYWRtMV9wY29kZSkgJT4lIA0KICBzZWxlY3RfYWxsKC4sIH4gc3RyX3RvX3RpdGxlKC4pKSAlPiUgDQogIGRhdGF0YWJsZShvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFKSwgDQogICAgICAgICAgICBmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOjEyMCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnJlYWtkb3duIGJ5IGNvdW50eSBhbmQgcGFydG5lciIpKSAlPiUgDQogIGZvcm1hdFN0eWxlKDAsIHRhcmdldCA9ICJyb3ciLCBsaW5lSGVpZ2h0ID0gIjgwJSIsIGZvbnRTaXplID0gIjgwJSIpICU+JSANCiAgZm9ybWF0Q3VycmVuY3koYygiUmVhY2hlZCIpLCANCiAgICAgICAgICAgICAgICAgY3VycmVuY3kgPSAiIiwgaW50ZXJ2YWwgPSAzLCBtYXJrID0gIiwiKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoIlJlYWNoZWQiKSwgZGlnaXRzID0gMCkNCg0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNCiMjIDMuMiBTdW1tYXJ5IGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyDQoNCg0KVGhlIHRhYmxlIGJlbG93IGJyZWFrcyBkb3duIHBlcnNvbnMgcmVhY2hlZCBieSBwYXJ0bmVyLiANCg0KPGJyPg0KDQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBtdXRhdGUoaW1wbGVtZW50aW5nX3BhcnRuZXIgPSBzdHJfc3ViKGltcGxlbWVudGluZ19wYXJ0bmVyLCBlbmQgPSA1MEwpKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgDQogIHN1bW1hcmlzZShyZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgY291bnRpZXMgPSBuX2Rpc3RpbmN0KGFkbTFfcGNvZGUpLCANCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgZmlsdGVyKHJlYWNoZWQgPiAwKSAlPiUgDQogIG11dGF0ZShgJXRvdGFsYCA9IHJvdW5kKHJlYWNoZWQgLyBzdW0ocmVhY2hlZCkgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhyZWFjaGVkKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiU3VtbWFyeSBieSBpbXBsZW1lbnRpbmcgcGFydG5lciIpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45KSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gMiwgcmVmX3N5bWJvbHMgPSAiMSIsIHBhcnQgPSAiaGVhZGVyIiwNCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJBbGwgaW5kaWNhdG9ycyBhcyBvcHBvc2VkIG9ubHkgaW5kaWNhdG9ycyAxLCAyLCA1IGFuZCA2IikpICU+JSANCiAgZm9vdG5vdGUoaSA9IDEsIGogPSA1LCByZWZfc3ltYm9scyA9ICIyIiwgcGFydCA9ICJoZWFkZXIiLA0KICAgICAgICAgICBhc19wYXJhZ3JhcGgoIlBlcmNlbnRhZ2Ugb2YgcmVhY2hlZCBmb3IgYWxsIGluZGljYXRvcnMiKSkNCg0KDQpgYGANCg0KDQo8YnI+PGJyPjxicj4NCg0KDQojIDQuIFNjaG9vbHMgYW5kIGVkdWNhdGlvbiBsZXZlbA0KDQojIyA0LjEgU2Nob29scw0KDQpUaGUgbnVtYmVyIG9mIHNjaG9vbHMgcmVhY2hlZCBieSBzY2hvb2wgZmVlZGluZyBwcm9ncmFtbWVzIGFuZCBXQVNIIGluIHNjaG9vbHMgaW50ZXJ2ZW50aW9ucyB0by1kYXRlIGFyZTogDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGZpbHRlcighaXMubmEoc2Nob29scykpICU+JQ0KICBtdXRhdGUoZGF0ZSA9IG5hbWVfdG9fZGF0ZShtb250aCkpICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMnw0IikpICU+JSANCiAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0LCBkYXRlKSAlPiUgDQogIHN1bW1hcmlzZShzY2hvb2xzID0gc3VtKHNjaG9vbHMpLCANCiAgICAgICAgICAgIHJlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZCkpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fc2Nob29scyA9IGN1bXN1bShzY2hvb2xzKSkgJT4lIA0KICBhcnJhbmdlKGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY3VtX3NjaG9vbHMpLCANCiAgICAgICAgIHZqdXN0ID0gLS41KSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKyANCiAgZ2VvbV9saW5lKHNpemUgPSAxLjcsIA0KICAgICAgICAgICAgYWVzKGNvbG91ciA9IGluZGljYXRvcl9zaG9ydCkpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShjdW1fc2Nob29scykpLCB2anVzdCA9IC0uNSkgKw0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiMzMTY4OGUiLCAiI2Q4NTc2YiIpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArIA0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJDdW11bGF0aXZlIG51bWJlciBvZiBzY2hvb2xzIHJlYWNoZWQiLCANCiAgICAgICB0aXRsZSA9ICJTY2hvb2xzIHJlYWNoZWQgYnkgZmVlZGluZyBwcm9ncmFtbWVzIGFuZCBXQVNIIGluIHNjaG9vbHMiLCANCiAgICAgICBjb2xvdXIgPSAiSW5kaWNhdG9yIikNCg0KDQpgYGANCg0KPGJyPg0KDQpIb3dldmVyLCByZXBvcnRpbmcgdGhlIG92ZXJhbGwgbnVtYmVyIG9mIHNjaG9vbHMgcmVhY2hlZCBieSBhbGwgRWlFIGludGVydmVudGlvbnMgaXMgbXVjaCBtb3JlIGNoYWxsZW5naW5nLg0KDQpXaGlsc3QgYWxsIHBhcnRuZXJzIHdvcmtpbmcgb24gaW5kaWNhdG9ycyAyIGFuZCA0IHN1Ym1pdHRlZCB0aGUgbnVtYmVyIG9mIHNjaG9vbHMgdGhleSB3ZXJlIHdvcmtpbmcgaW4sIHRoZSBzYW1lIGlzIG5vdCB0cnVlIGZvciB0aGUgb3RoZXIgaW5kaWNhdG9ycy4gT25seSBpbmRpY2F0b3JzIDIgYW5kIDQgcmVxdWlyZSB0aGUgcmVwb3J0aW5nIG9mIHRoZSBudW1iZXIgb2Ygc2Nob29scy4gDQoNCg0KDQo8YnI+PGJyPjxicj4NCg0KDQojIyA0LjIgRWR1Y2F0aW9uIGxldmVsIA0KDQpUaGUgZGF0YSBjb2xsZWN0ZWQgb24gZWR1Y2F0aW9uIGxldmVsIGlzIG11ZGRsZWQ6IHRoZSBjb21iaW5hdGlvbiBvZiB2YXJpb3VzIGNhdGVnb3JpZXMgKHN1Y2ggYXMgYEVDRSAmIFByaW1hcnlgIGFuZCBgQWxsIEJhc2ljIEVkdWNhdGlvbmApIGhhbXBlcnMgYSBjbGVhbiBicmVha2Rvd24gYnkgZWR1Y2F0aW9uIGxldmVsOiANCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGdpcmxzLCBib3lzLCBtZW4sIHdvbWVuKSwgfiByZXBsYWNlX25hKC4sIDApKSAlPiUgDQogIGZpbHRlcighaXMubmEoZWR1Y2F0aW9uX2xldmVsKSkgJT4lIA0KICBtdXRhdGUoY2hpbGRyZW4gPSBib3lzICsgZ2lybHMpICU+JSANCiAgZ3JvdXBfYnkoZWR1Y2F0aW9uX2xldmVsKSAlPiUgDQogIHN1bW1hcmlzZShjaGlsZHJlbiA9IHN1bShjaGlsZHJlbikpICU+JSANCiAgYXJyYW5nZShkZXNjKGNoaWxkcmVuKSkgJT4lIA0KICBtdXRhdGUoYCVfb2ZfdG90YWxgID0gcm91bmQoY2hpbGRyZW4gLyBzdW0oY2hpbGRyZW4pICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiQ2hpbGRyZW4gcmVhY2hlZCBieSBlZHVjYXRpb24gbGV2ZWwiKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuNikNCmBgYA0KDQo8YnI+DQoNCkZvciBpbnN0YW5jZSwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHNlcnZlZCBmcm9tIHByaW1hcnktbGV2ZWwgaW5zdGl0dXRpb25zLiANCg0KVG8gdW5kZXJzdGFuZCByZXBvcnRpbmcgYXJvdW5kIHRoZSBtaXNtYXRjaCBvZiBlZHVjYXRpb24tbGV2ZWwgY2F0ZWdvcmllcywgbGV0IHVzIGV4YW1pbmUgaW5kaXZpZHVhbCBpbmRpY2F0b3JzLiBJbiB0aGUgcGxvdCBiZWxvdywgY2hpbGRyZW4gcmVhY2hlZCBoYXZlIGJlZW4gYnJva2VuIGRvd24gYnkgZWR1Y2F0aW9uIGxldmVsIGFuZCBieSBpbmRpY2F0b3IuIFRoZSBjYXRlZ29yeSBgQWxsIEJhc2ljIEVkdWNhdGlvbmAsIHdoaWxzdCBwcmVzZW50IGluIGFsbCBvZiB0aGUgaW5kaWNhdG9ycywgaXMgbW9zdCBoZWF2aWx5IHVzZWQgaW4gdGhlIFdBU0gtaW4tc2Nob29scyBpbnRlcnZlbnRpb24uIEFkZGl0aW9uYWxseSwgdGhpcyBpbmRpY2F0b3IgaXMgdXNlZCBieSA1IGRpZmZlcmVudCBpbXBsZW1lbnRpbmcgcGFydG5lcnMuIA0KDQo8YnI+DQoNCmBgYHtyfQ0KDQoNCmVpZSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGdpcmxzLCBib3lzLCBtZW4sIHdvbWVuKSwgfiByZXBsYWNlX25hKC4sIDApKSAlPiUgDQogIGZpbHRlcighaXMubmEoZWR1Y2F0aW9uX2xldmVsKSkgJT4lIA0KICBtdXRhdGUocmVhY2hlZCA9IGJveXMgKyBnaXJscyArIG1lbiArIHdvbWVuKSAlPiUgDQogIGdyb3VwX2J5KGVkdWNhdGlvbl9sZXZlbCwgaW5kaWNhdG9yX3Nob3J0KSAlPiUNCiAgc3VtbWFyaXNlKHJlYWNoZWQgPSBzdW0ocmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0ocmVhY2hlZCkpICU+JSAgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShwYyA9IHJlYWNoZWQgLyB0b3RhbCwgDQogICAgICAgICBpbmRpY2F0b3Jfc2hvcnQgPSBmY3RfcmV2KGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGMsIHkgPSBpbmRpY2F0b3Jfc2hvcnQsIGZpbGwgPSBlZHVjYXRpb25fbGV2ZWwpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMoeCA9IHBjLCANCiAgICAgICAgICAgICAgICB5ID0gaW5kaWNhdG9yX3Nob3J0LCANCiAgICAgICAgICAgICAgICBsYWJlbCA9IHBlcmNlbnQocGMsIGFjY3VyYWN5ID0gMSkpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IC41KSwgDQogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50KSArIA0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJFZHVjYXRpb24tbGV2ZWwgYnJlYWtkb3duIGJ5IGluZGljYXRvciIsIA0KICAgICAgIGZpbGwgPSAiIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpDQogIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQoNCg0KDQoNCg0KIyA1LiBSZWZlcmVuY2UgbWFwcyBhbmQgdGFibGVzIA0KDQojIyA1LjEgUmVmZXJlbmNlIG1hcHMgDQoNCklQQyBkYXRhIGV4dHJhY3RlZCBmcm9tIFtoZXJlXShodHRwczovL3d3dy5pcGNpbmZvLm9yZy9pcGMtY291bnRyeS1hbmFseXNpcy9kZXRhaWxzLW1hcC9lbi9jLzExNTYyMTAvP2lzbzM9S0VOKS4gDQoNCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMH0NCmlwYyAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBudW1iZXJfcGhhc2VfcDMpKSArIA0KICBnZW9tX3NmX3RleHQoYWVzKGxhYmVsID0gY29tbWEobnVtYmVyX3BoYXNlX3AzKSksIA0KICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk0NSIsIA0KICAgICAgICAgICAgICAgc2l6ZSA9IDIpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJpbmZlcm5vIiwgYmVnaW4gPSAuNCwgLCBkaXJlY3Rpb24gPSAtMSkgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICJBdCBsZWFzdFxucGhhc2UgMyIsIA0KICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBwZXJzb25zIElQQyBQaGFzZSAzIG9yIGFib3ZlIiwgDQogICAgICAgc3VidGl0bGUgPSAiU291cmNlOiBodHRwczovL3d3dy5pcGNpbmZvLm9yZy8iKSArIA0KDQppcGMgJT4lIA0KICByaWdodF9qb2luKHBjb2RlMV9zaGFwZSwgDQogICAgICAgICAgICAgYnkgPSAiYWRtMV9wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2Yoc2l6ZSA9IC4wMSwgY29sb3VyID0gImdyZXk3MCIsIA0KICAgICAgICAgIGFlcyhmaWxsID0gcGVyY2VudF9waGFzZV9wMykpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KHBlcmNlbnRfcGhhc2VfcDMpKSwgDQogICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IiwgDQogICAgICAgICAgICAgICBzaXplID0gMikgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobGFiZWxzID0gcGVyY2VudCwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAiaW5mZXJubyIsIGJlZ2luID0gLjQsICwgZGlyZWN0aW9uID0gLTEpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICBsYWJzKGZpbGwgPSAiJSBJUEMgcGhhc2UgMyIsIA0KICAgICAgIHRpdGxlID0gIlBlcmNlbnRhZ2Ugb2YgcG9wdWxhdGlvbiBJUEMgUGhhc2UgMyBvciBhYm92ZSIsIA0KICAgICAgIHN1YnRpdGxlID0gIlNvdXJjZTogaHR0cHM6Ly93d3cuaXBjaW5mby5vcmcvIikgKw0KDQoNCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSkgJT4lIA0KICBzdW1tYXJpc2Uoc2VjdG9yX3JlYWNoZWQgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZmlsdGVyKHNlY3Rvcl9yZWFjaGVkID4gMCkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlMV9zaGFwZSwgDQogICAgICAgICAgICAgYnkgPSAiYWRtMV9wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2Yoc2l6ZSA9IC4wMSwgY29sb3VyID0gImdyZXk3MCIsIA0KICAgICAgICAgIGFlcyhmaWxsID0gc2VjdG9yX3JlYWNoZWQpKSArIA0KICBnZW9tX3NmX3RleHQoYWVzKGxhYmVsID0gY29tbWEoc2VjdG9yX3JlYWNoZWQpKSwgDQogICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IiwgDQogICAgICAgICAgICAgICBzaXplID0gMikgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIiwgDQogICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAibWFrbyIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSAuMiwNCiAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZyIsIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygwLCAxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDMzOTQ4MykpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICBsYWJzKGZpbGwgPSAiU2VjdG9yXG5yZWFjaGVkIiwgDQogICAgICAgdGl0bGUgPSAiUmVhY2hlZCBwZXJzb25zIikgKyANCiAgDQplaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIGdyb3VwX2J5KGFkbTFfcGNvZGUpICU+JSANCiAgc3VtbWFyaXNlKHJlYWNoZWQgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZnVsbF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIodGFyZ2V0X3VuaXQgPT0gInBlb3BsZSIpICU+JQ0KICAgICAgICAgICAgICBkaXN0aW5jdChhZG0xX3Bjb2RlLCB0YXJnZXQgPSBjb3VudHlfb3ZlcmFsbF90YXJnZXQpKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChyZWFjaGVkID0gMCwgdGFyZ2V0ID0gMCkpICU+JSANCiAgbXV0YXRlKHBjID0gaWZlbHNlKHRhcmdldCA9PSAwLCAwLCByZWFjaGVkIC8gdGFyZ2V0KSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlMV9zaGFwZSwgDQogICAgICAgICAgICAgYnkgPSAiYWRtMV9wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBwYykpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KHBjLCBhY2N1cmFjeSA9IDEpKSwgDQogICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IiwgDQogICAgICAgICAgICAgICBzaXplID0gMikgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxhYmVscyA9IHBlcmNlbnQsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLA0KICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLA0KICAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSAuMikgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICIlIG9mIHRhcmdldCIsIA0KICAgICAgIHRpdGxlID0gIlBlcmNlbnRhZ2Ugb2Ygb3ZlcmFsbCBjb3VudHkgdGFyZ2V0IHJlYWNoZWQiKSArICAgDQoNCnBsb3RfbGF5b3V0KG5jb2wgPSAyLCANCiAgICAgICAgICAgIG5yb3cgPSAyKQ0KICANCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KDQojIyA1LjIgUmVmZXJlbmNlIHRhYmxlIA0KDQpEb3dubG9hZCB0aGUgRWlFIDVXcyBkYXRhIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20va2VueWEtZWllLXdnL2VpZV93Z181d3MvYmxvYi9tYWluL2RhdGEvZWllXzV3cy5jc3YpDQoNCkFzIGEgcmVmcmVzaGVyIGZvciB0aGUgcmVmZXJlbmNlIHRhYmxlIGJlbG93LCB0aGUgaW5kaWNhdG9ycyBhcmU6IA0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZGlzdGluY3QoaW5kaWNhdG9yKSAlPiUgDQogIGFycmFuZ2UoaW5kaWNhdG9yKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKHdpZHRoID0gLjg1LCBsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JSANCiAgZm9udHNpemUoaSA9IDE6NiwgaiA9IDEsIHNpemUgPSA5KSANCg0KYGBgDQoNCjxicj4NCg0KDQpgYGB7cn0NCmVpZSAlPiUNCiAgbXV0YXRlKGltcGxlbWVudGluZ19wYXJ0bmVyID0gc3RyX3N1YihpbXBsZW1lbnRpbmdfcGFydG5lciwgZW5kID0gNTBMKSwgDQogICAgICAgICBpbmRpY2F0b3JfbnVtYmVyID0gcGFyc2VfbnVtYmVyKGluZGljYXRvcl9zaG9ydCkpICU+JQ0KICBncm91cF9ieShjb3VudHksIGFkbTFfcGNvZGUsIGltcGxlbWVudGluZ19wYXJ0bmVyLCBpbmRpY2F0b3JfbnVtYmVyKSAlPiUgDQogIHN1bW1hcmlzZShyZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgc2VsZWN0KGNvdW50eSwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGluZGljYXRvciA9IGluZGljYXRvcl9udW1iZXIsIHJlYWNoZWQsIGFkbTFfcGNvZGUpICU+JSANCiAgZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUpLCANCiAgICAgICAgICAgIGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6MTIwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCcmVha2Rvd24gYnkgaW5kaWNhdG9yLCBjb3VudHkgYW5kIGltcGxlbWVudGluZyBwYXJ0bmVyIikpICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODAlIiwgZm9udFNpemUgPSAiODAlIikgJT4lIA0KICBmb3JtYXRDdXJyZW5jeShjKCJyZWFjaGVkIiksIA0KICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICIiLCBpbnRlcnZhbCA9IDMsIG1hcmsgPSAiLCIpICU+JSANCiAgZm9ybWF0Um91bmQoYygicmVhY2hlZCIpLCBkaWdpdHMgPSAwKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K